import pandas as pd


def merge_excel_files(excel1_path, excel2_path, output_path='merged_result.xlsx'):
    """
    根据学科ID和教材名称关联两个Excel文件，将第二个Excel的tutorial_version_id填充到第一个Excel中

    Args:
        excel1_path: 第一个Excel文件路径 (包含 学科id, 教材名称 列)
        excel2_path: 第二个Excel文件路径 (包含 subject_id, tutorial_version_name, tutorial_version_id 列)
        output_path: 输出文件路径

    Returns:
        merged_df: 合并后的DataFrame
    """

    try:
        # 读取两个Excel文件
        print("正在读取Excel文件...")
        df1 = pd.read_excel(excel1_path)
        df2 = pd.read_excel(excel2_path)

        print(f"第一个Excel文件形状: {df1.shape}")
        print(f"第二个Excel文件形状: {df2.shape}")

        # 显示列名以便检查
        print(f"\n第一个Excel的列名: {list(df1.columns)}")
        print(f"第二个Excel的列名: {list(df2.columns)}")

        # 检查必要的列是否存在
        required_cols1 = ['学科id', '教材名称']
        required_cols2 = ['subject_id', 'tutorial_version_name', 'tutorial_version_id']

        missing_cols1 = [col for col in required_cols1 if col not in df1.columns]
        missing_cols2 = [col for col in required_cols2 if col not in df2.columns]

        if missing_cols1:
            raise ValueError(f"第一个Excel缺少必要的列: {missing_cols1}")
        if missing_cols2:
            raise ValueError(f"第二个Excel缺少必要的列: {missing_cols2}")

        # 数据类型转换，确保关联字段类型一致
        df1['学科id'] = df1['学科id'].astype(str)
        df1['教材名称'] = df1['教材名称'].astype(str)
        df2['subject_id'] = df2['subject_id'].astype(str)
        df2['tutorial_version_name'] = df2['tutorial_version_name'].astype(str)

        # 执行左连接 (保留第一个Excel的所有数据)
        print("\n正在执行数据关联...")
        merged_df = df1.merge(
            df2[['subject_id', 'tutorial_version_name', 'tutorial_version_id']],
            left_on=['学科id', '教材名称'],
            right_on=['subject_id', 'tutorial_version_name'],
            how='left'
        )

        # 删除重复的关联列
        merged_df = merged_df.drop(['subject_id', 'tutorial_version_name'], axis=1)

        # 统计关联结果
        total_rows = len(df1)
        matched_rows = merged_df['tutorial_version_id'].notna().sum()
        unmatched_rows = total_rows - matched_rows

        print(f"\n关联结果统计:")
        print(f"总记录数: {total_rows}")
        print(f"成功匹配: {matched_rows}")
        print(f"未匹配: {unmatched_rows}")
        print(f"匹配率: {matched_rows / total_rows * 100:.2f}%")

        # 显示未匹配的记录
        if unmatched_rows > 0:
            print(f"\n未匹配的记录:")
            unmatched_df = merged_df[merged_df['tutorial_version_id'].isna()][['学科id', '教材名称']]
            print(unmatched_df.head(10))  # 只显示前10条
            if len(unmatched_df) > 10:
                print(f"... 还有 {len(unmatched_df) - 10} 条未匹配记录")

        # 保存结果
        merged_df.to_excel(output_path, index=False, engine='openpyxl')
        print(f"\n合并结果已保存到: {output_path}")

        return merged_df

    except Exception as e:
        print(f"处理过程中出现错误: {e}")
        return None


def analyze_match_details(excel1_path, excel2_path):
    """
    分析两个Excel文件的匹配情况，帮助诊断问题

    Args:
        excel1_path: 第一个Excel文件路径
        excel2_path: 第二个Excel文件路径
    """

    try:
        df1 = pd.read_excel(excel1_path)
        df2 = pd.read_excel(excel2_path)

        print("=== 匹配分析报告 ===")

        # 第一个文件的学科和教材组合
        df1_combinations = df1[['学科id', '教材名称']].drop_duplicates()
        df1_combinations['学科id'] = df1_combinations['学科id'].astype(str)
        df1_combinations['教材名称'] = df1_combinations['教材名称'].astype(str)

        # 第二个文件的学科和教材组合
        df2_combinations = df2[['subject_id', 'tutorial_version_name']].drop_duplicates()
        df2_combinations['subject_id'] = df2_combinations['subject_id'].astype(str)
        df2_combinations['tutorial_version_name'] = df2_combinations['tutorial_version_name'].astype(str)

        print(f"第一个Excel中的学科-教材组合数: {len(df1_combinations)}")
        print(f"第二个Excel中的学科-教材组合数: {len(df2_combinations)}")

        # 找出第一个文件中独有的组合
        df1_key = df1_combinations['学科id'] + '|' + df1_combinations['教材名称']
        df2_key = df2_combinations['subject_id'] + '|' + df2_combinations['tutorial_version_name']

        unique_in_df1 = df1_combinations[~df1_key.isin(df2_key)]
        common_combinations = df1_combinations[df1_key.isin(df2_key)]

        print(f"可以匹配的组合数: {len(common_combinations)}")
        print(f"第一个Excel中无法匹配的组合数: {len(unique_in_df1)}")

        if len(unique_in_df1) > 0:
            print(f"\n无法匹配的学科-教材组合示例:")
            print(unique_in_df1.head(10))

        # 显示第二个文件中的一些组合供参考
        print(f"\n第二个Excel中的学科-教材组合示例:")
        print(df2_combinations.head(10))

    except Exception as e:
        print(f"分析过程中出现错误: {e}")


def merge_with_fuzzy_match(excel1_path, excel2_path, output_path='merged_result_fuzzy.xlsx'):
    """
    使用模糊匹配进行关联（适用于教材名称可能有细微差异的情况）
    """
    try:
        from fuzzywuzzy import fuzz, process
        print("使用模糊匹配功能需要安装 fuzzywuzzy 库: pip install fuzzywuzzy python-Levenshtein")
    except ImportError:
        print("模糊匹配功能需要安装 fuzzywuzzy 库")
        print("请运行: pip install fuzzywuzzy python-Levenshtein")
        return merge_excel_files(excel1_path, excel2_path, output_path)

    # 这里可以实现模糊匹配逻辑
    # 暂时回退到精确匹配
    return merge_excel_files(excel1_path, excel2_path, output_path)


# 使用示例
if __name__ == "__main__":
    # 文件路径 - 请修改为你的实际文件路径
    excel1_path = "D:\\pycharmProject\\pythonProject\\测试-教材信息.xlsx"  # 包含 学科id, 教材名称 的文件
    excel2_path = "D:\\project_file\\周末智学 教材版本统一\\测试库周末智学数据.xlsx"  # 包含 subject_id, tutorial_version_name, tutorial_version_id 的文件
    output_path = "测试-合并结果.xlsx"

    print("=== Excel文件关联填充工具 ===")

    # 先分析匹配情况
    print("1. 分析匹配情况...")
    # analyze_match_details(excel1_path, excel2_path)

    print("\n2. 执行数据合并...")
    # 执行合并
    result_df = merge_excel_files(excel1_path, excel2_path, output_path)

    if result_df is not None:
        print("\n3. 显示合并结果前5行:")
        print(result_df.head())

        print(f"\n4. 最终结果列名: {list(result_df.columns)}")


# 快速使用函数
def quick_merge(file1, file2, output="merged.xlsx"):
    """
    快速合并函数
    """
    return merge_excel_files(file1, file2, output)